# @Author   :hcs
# @File     :5-正则表达式之匹配多个字符.py
# @Time     :2025/2/27 下午9:13

import re

# * :表示匹配前一个字符出现0次或者无限次，即可有可无
# 需求：匹配出，一个字符串第一个字母为大写字符，后面都是小写字母并且这些小写字母可有可无
ret = re.match("[A-Z][a-z]*", "M")  # 再这个正则表达式中，*只对[a-z]起作用而不会对[A-Z]起作用
print(ret.group())
ret = re.match("[A-Z][a-z]*", "MnnM")
print(ret.group())
ret = re.match("[A-Z][a-z]*", "Aabcdef")
print(ret.group())

# + :表示匹配前一个字符出现1次或者无限次，即至少有1次
# \w :表示匹配单词字符，即a-z、A-Z、0-9、_(汉字)word
# 需求：匹配出变量名是否有效
names = ["name1", "_name", "2_name", "__name__"]
for name in names:
    ret = re.match(r"[a-zA-Z_]\w*", name)  # [a-zA-Z_]表示开头只能是字母或者下划线，\w表示接下来的只要是数字/字母/下划线就行
    if ret:
        print("变量名 %s 符合要求" % ret.group())
    else:
        print("变量名 %s 非法" % name)

# 需求：匹配0-99之间的数字（待定）


# {m} :表示匹配前一个字符出现m次
# {m,n} :表示匹配前一个字符出现从m到n次（默认是贪婪的，会一直匹配到最高位）
# ^ :当 ^ 出现在正则表达式的开头时，它用于指定匹配必须从字符串的起始位置开始。
#    当 ^ 出现在字符类 [] 内部的开头时，它表示取反，即匹配不在字符类中指定的任意字符。
# $ :匹配字符串结尾
# 需求：匹配出8到20位的密码，可以是大小写英文字母、数字、下划线
ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")
print(ret.group())

# 题目1：匹配出163的邮箱地址，且@符号之前有4到20位，例如hello@163.com
email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
for email in email_list:
    ret = re.match("[a-zA-Z0-9_]{4,20}@163.com$", email)
    if ret:
        print(f"{email}是符合规定的邮件地址,匹配后的结果是:{ret.group()}")
    else:
        print(f"{email}不符合要求！")


